package ruide_info_mvc.base.core.ioc;

import org.springframework.context.ApplicationContext;

import java.util.concurrent.locks.ReentrantLock;

/**
 *  自定义IOC容器,重写IOC<br/>
 *  仅供架构使用,业务代码不可以使用此类,因为会吃掉不少内存,并且会出现幻读BEAN的现象.<br/>
 *  如果你读过spring init源码,会比BEAN init还要早初始化,所以会导致XMX,XMS中内存溢出现象.<br/>
 *  违反了 阿里巴巴代码规范 中的spring 使用规范! <br/>
 *  业务代码禁用!!!
 * @ClassName CustomIoc
 * @Author wangBo
 * @Date 2019/7/20 0020 下午 9:29
 * @Version 1.0
 */
public class CustomIoc {

    private CustomIoc(){}

    private static transient ApplicationContext applicationContext;

    // 使用公平锁,自旋锁
    private static ReentrantLock reentrantLock = new ReentrantLock(true);

    public static void setApplicationContext(ApplicationContext applicationContext) {
        CustomIoc.applicationContext = applicationContext;
    }

    /**
     * 功能描述: 将方法区中的堆栈手动回收给GC
     * @Author wangBo
     * @Date 2019/7/4 0004 下午 2:24
     **/
    public static void clear() {
        reentrantLock.tryLock();
        try {
            CustomIoc.applicationContext = null;
        } finally {
            reentrantLock.unlock();
        }
    }

    /**
     * 功能描述: 获取spring IOC 容器
     * @Author wangBo
     * @Date 2019/7/4 0004 下午 2:23
     * @return ApplicationContext
     **/
    public static ApplicationContext getApplicationContext() {
        reentrantLock.tryLock();
        try {
            return CustomIoc.applicationContext;
        } finally {
            reentrantLock.unlock();
        }
    }
}
